home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / program / morcl201.lha / mc_fract.c < prev   
C/C++ Source or Header  |  1995-10-14  |  7KB  |  286 lines

  1. /******************************************************************************
  2. **                                                                           **
  3. ** MultiColor-Demo-Fract                                                     **
  4. **                                                                           **
  5. **---------------------------------------------------------------------------**
  6. ** V2.0 vom 01.10.95                                                         **
  7. ******************************************************************************/
  8.  
  9. // good spots
  10. // 
  11. // -1.460652  -1.454792  -0.002050  +0.002050  300 1
  12. // -1.279381  -1.267661  -0.059969  -0.051769  300 1
  13. // +0.308857  +0.319540  -0.032816  -0.025317  300 1
  14. // +0.3121861 +0.3128537 -0.0313250 -0.0308563 400 0
  15.  
  16. #include "sc:source/mc/multicolor.h"
  17.  
  18. /* Protos */
  19.  
  20. void OpenAll(void);
  21. void CloseAll(void);
  22. void CRange(MCPoint *ctab,UWORD six,MCPoint sc,UWORD eix,MCPoint ec);
  23. void Palette(MCPoint *ctab);
  24. void Fract(double x1,double x2,double y1,double y2,UWORD it,UWORD cs,MCPoint *ctab);
  25. void Usage(void);
  26.  
  27. /* defines */
  28.  
  29. extern struct ExecBase         *SysBase;
  30. struct IntuitionBase        *IntuitionBase=0l;
  31. struct GfxBase                 *GfxBase=0l;
  32. struct Screen                *scr=0l;
  33. struct Window                *win=0l;
  34. MCHandle                    *mch=0l;
  35.  
  36. #define maxc 256
  37. MCPoint                        ctab[maxc+1];
  38.  
  39.  
  40. struct TagItem scrtags[]={
  41.     SA_Left,        0,
  42.     SA_Top,            0,
  43.     SA_Width,        0,
  44.     SA_Height,        0,
  45.     SA_Depth,        0,
  46.     SA_Colors,        0l,
  47.     SA_Type,        CUSTOMSCREEN,
  48.     SA_DisplayID,    PAL_MONITOR_ID,
  49.     TAG_DONE
  50. };
  51.  
  52. struct TagItem wintags[]={
  53.     WA_Left,        0,
  54.     WA_Top,            0,
  55.     WA_Width,        0,
  56.     WA_Height,        0,
  57.     WA_IDCMP,        IDCMP_MOUSEBUTTONS|IDCMP_RAWKEY,
  58.     WA_Flags,        WFLG_SMART_REFRESH|WFLG_RMBTRAP|WFLG_BORDERLESS|WFLG_ACTIVATE,
  59.     WA_CustomScreen,0l,
  60.     TAG_DONE
  61. };
  62.  
  63. /* Funktions */
  64.  
  65. void OpenAll(void)
  66. {
  67. //    if(!(IntuitionBase=OpenLibrary("intuition.library",37))) CloseAll();
  68.     if(!(IntuitionBase=OpenLibrary("intuition.library",39))) CloseAll();
  69.     if(!(GfxBase=OpenLibrary("graphics.library",37))) CloseAll();
  70.  
  71.     if(!(scr=OpenScreenTagList(0l,scrtags))) CloseAll();
  72.     wintags[6].ti_Data=scr;
  73.  
  74.     if(!(win=OpenWindowTagList(0l,wintags))) CloseAll();
  75. }
  76.  
  77. void CloseAll(void)
  78. {
  79.     if(win)                CloseWindow(win);
  80.     if(scr)                CloseScreen(scr);
  81.     if(GfxBase)            CloseLibrary(GfxBase);
  82.     if(IntuitionBase)    CloseLibrary(IntuitionBase);
  83.     exit(0);
  84. }
  85.  
  86. void CRange(MCPoint *ctab,UWORD six,MCPoint sc,UWORD eix,MCPoint ec)
  87. {
  88.     register UWORD i;
  89.     UWORD anz=eix-six;
  90.     double rd,gd,bd;
  91.  
  92.     rd=(ec.r-sc.r)/(double)anz;
  93.     gd=(ec.g-sc.g)/(double)anz;
  94.     bd=(ec.b-sc.b)/(double)anz;
  95.     for(i=0;i<anz;i++)
  96.     {
  97.         sc.r+=rd;
  98.         sc.g+=gd;
  99.         sc.b+=bd;
  100.         ctab[six+i]=sc;
  101.     }
  102. }
  103.  
  104. void Palette(MCPoint *ctab)
  105. {
  106.     MCPoint p1,p2;
  107.  
  108.     p1.r=0.0;p1.g=0.0;p1.b=0.0;
  109.     p2.r=1.0;p2.g=0.0;p2.b=0.0;CRange(ctab,  0,p1, 32,p2);
  110.     p1.r=1.0;p1.g=1.0;p1.b=0.0;CRange(ctab, 32,p2, 64,p1);
  111.     p2.r=0.0;p2.g=1.0;p2.b=0.0;CRange(ctab, 64,p1, 96,p2);
  112.     p1.r=0.0;p1.g=1.0;p1.b=1.0;CRange(ctab, 96,p2,128,p1);
  113.     p2.r=0.0;p2.g=0.0;p2.b=1.0;CRange(ctab,128,p1,160,p2);
  114.     p1.r=1.0;p1.g=0.0;p1.b=1.0;CRange(ctab,160,p2,192,p1);
  115.     p2.r=1.0;p2.g=0.0;p2.b=0.0;CRange(ctab,192,p1,224,p2);
  116.     p1.r=0.0;p1.g=0.0;p1.b=0.0;CRange(ctab,224,p2,256,p1);
  117. }
  118.  
  119. void Fract(double x1,double x2,double y1,double y2,UWORD it,UWORD cs,MCPoint *ctab)
  120. {
  121.     struct IntuiMessage *imsg;
  122.     ULONG iclass;
  123.     USHORT icode;
  124.     register UBYTE quit=0;
  125.     register UWORD i,j,n,h;
  126.     MCPoint akt;
  127.     double x,y,xd,yd,a,b,c,d;
  128.  
  129.     xd=(x2-x1)/mch->xres;
  130.     yd=(y2-y1)/mch->yres;
  131.     y=y1;
  132.     for(j=0;j<mch->yres;j++)
  133.     {
  134.         x=x1;
  135.         for(i=0;i<mch->xres;i++)
  136.         {
  137.             c=(a=x)*a;d=(b=y)*b;h=0;
  138.             for(n=1;n<it;n++)
  139.             {
  140.                 b=2.0*a*b+y;
  141.                 c=(a=c-d+x)*a;
  142.                 d=b*b;
  143.                 if(c+d>4.0) { h=n;n=it; }
  144.             }
  145.             akt=ctab[(h<<cs)%maxc];
  146.             MC_PutPixel(mch,i,j,akt);
  147.             x+=xd;
  148.         }
  149.         y+=yd;
  150.     }
  151.  
  152.  
  153.     while(!quit)
  154.     {
  155.         WaitPort(win->UserPort);
  156.         while(imsg=GetMsg(win->UserPort))
  157.         {
  158.             iclass    =imsg->Class;
  159.             icode    =imsg->Code;
  160.             ReplyMsg(imsg);
  161.             switch(iclass)
  162.             {
  163.                 case IDCMP_RAWKEY:
  164.                     switch(icode)
  165.                     {
  166.                         case 0x45:        /* ESC */
  167.                         case 0x40:        /* Space */
  168.                             quit=1;break;
  169.                     }
  170.                     break;
  171.             }
  172.         }
  173.     }
  174. }
  175.  
  176. void Usage(void)
  177. {
  178.     printf("Usage \n");
  179.     printf("\tmc_bleed typ res\n");
  180.     printf("\tres\typ | 0=ECS | 1=AGA,GFX-Card\n");
  181.     printf("\t--------+-------+---------------\n");
  182.     printf("\t e (ehb)| 64    | -             \n");
  183.     printf("\t l (low)| 32    | 256           \n");
  184.     printf("\t h (hi )| 16    | 256           \n");
  185.     printf("\t s (shi)| --    | 256           \n");
  186.     printf("\t--------+-------+---------------\n");
  187. }
  188.  
  189. void main(int argc,char *argv[])
  190. {
  191.     UBYTE dep,typ,fail=0;
  192.     char res;
  193.     double x1=-2.0,x2=1.0,y1=-1.35,y2=1.35;
  194.     UWORD it=80,cs=2;
  195.  
  196.     if(argc>=3)
  197.     {
  198.         typ=atoi(argv[1])&1;
  199.         res=argv[2][0];
  200.         if(argc>=4) x1=atof(argv[3]);
  201.         if(argc>=5) x2=atof(argv[4]);
  202.         if(argc>=6) y1=atof(argv[5]);
  203.         if(argc>=7) y2=atof(argv[6]);
  204.         if(argc>=8) it=atoi(argv[7]);
  205.         if(argc>=9) cs=atoi(argv[8]);
  206.  
  207.         switch(typ)
  208.         {
  209.             case 0:        /* ECS */
  210.                 switch(res)
  211.                 {
  212.                     case 'E':
  213.                     case 'e':
  214.                         scrtags[4].ti_Data=dep=6;
  215.                         wintags[2].ti_Data=scrtags[2].ti_Data=354;        /* 236 */
  216.                         wintags[3].ti_Data=scrtags[3].ti_Data=552;        /* 276 */
  217.                         scrtags[7].ti_Data|=EXTRAHALFBRITELACE_KEY;
  218.                         break;
  219.                     case 'L':
  220.                     case 'l':
  221.                         scrtags[4].ti_Data=dep=5;
  222.                         wintags[2].ti_Data=scrtags[2].ti_Data=354;        /* 236 */
  223.                         wintags[3].ti_Data=scrtags[3].ti_Data=552;        /* 276 */
  224.                         scrtags[7].ti_Data|=LORESLACE_KEY;
  225.                         break;
  226.                     case 'H':
  227.                     case 'h':
  228.                         scrtags[4].ti_Data=dep=4;
  229.                         wintags[2].ti_Data=scrtags[2].ti_Data=708;        /* 472 */
  230.                         wintags[3].ti_Data=scrtags[3].ti_Data=552;        /* 276 */
  231.                         scrtags[7].ti_Data|=HIRESLACE_KEY;
  232.                         break;
  233.                     case 'S':
  234.                     case 's':
  235.                         fail=1;
  236.                         break;
  237.                 }
  238.                 break;
  239.             case 1:        /* AGA,GFX-Card */
  240.                 switch(res)
  241.                 {
  242.                     case 'E':
  243.                     case 'e':
  244.                         fail=1;
  245.                         break;
  246.                     case 'L':
  247.                     case 'l':
  248.                         scrtags[4].ti_Data=dep=8;
  249.                         wintags[2].ti_Data=scrtags[2].ti_Data=354;        /* 236 */
  250.                         wintags[3].ti_Data=scrtags[3].ti_Data=552;        /* 276 */
  251.                         scrtags[7].ti_Data|=LORESLACE_KEY;
  252.                         break;
  253.                     case 'H':
  254.                     case 'h':
  255.                         scrtags[4].ti_Data=dep=8;
  256.                         wintags[2].ti_Data=scrtags[2].ti_Data=708;        /* 472 */
  257.                         wintags[3].ti_Data=scrtags[3].ti_Data=552;        /* 276 */
  258.                         scrtags[7].ti_Data|=HIRESLACE_KEY;
  259.                         break;
  260.                     case 'S':
  261.                     case 's':
  262.                         scrtags[4].ti_Data=dep=8;
  263.                         wintags[2].ti_Data=scrtags[2].ti_Data=1416;        /* 944 */
  264.                         wintags[3].ti_Data=scrtags[3].ti_Data=552;        /* 276 */
  265.                         scrtags[7].ti_Data|=SUPERLACE_KEY;
  266.                         break;
  267.                 }
  268.                 break;
  269.         }
  270.  
  271.         if(!fail)
  272.         {
  273.             OpenAll();
  274.             if(mch=MC_Init(scr,win,dep))
  275.             {
  276.                 Palette(ctab);
  277.                 Fract(x1,x2,y1,y2,it,cs,ctab);
  278.                 MC_Free(mch);
  279.             }
  280.         }
  281.         else Usage();
  282.     }
  283.     else Usage();
  284.     CloseAll();
  285. }
  286.